package com.springday.springmvc.dao.impl;

import java.util.List;

import javax.sql.DataSource;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

import com.springday.springmvc.dao.ProductoDao;
import com.springday.springmvc.domain.Producto;

/**
 * 
 * @author Susan Inga
 *
 */

@Repository
public class ProductoDaoImpl implements ProductoDao {
	
	private HibernateTemplate hibernateTemplate;
    
    @Autowired
    public ProductoDaoImpl(SessionFactory sessionFactory) {
        this.hibernateTemplate = new HibernateTemplate(sessionFactory);
    }
    
    private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public void guardarProducto(Producto producto) {

		hibernateTemplate.saveOrUpdate(producto);
	}
	
	@Override
	public Producto obtenerProducto(Integer id) {

		Producto producto = hibernateTemplate.get(Producto.class, id);
		return producto;
	}

	@Override
	public void eliminarProducto(Integer id) {

		Producto producto = obtenerProducto(id);
		hibernateTemplate.delete(producto);
		hibernateTemplate.flush();
	}	
	
	@SuppressWarnings("unchecked")
	public List<Producto> obtenerListaProductos(Producto producto) {
		
		List<Producto> productos = hibernateTemplate.find("from Producto");
		return productos;
	}
	
	@Override
	public int contarProductos() {
		
		StringBuilder query = new StringBuilder("SELECT COUNT(*) FROM producto");
		int cantidadProductos = jdbcTemplate.queryForInt(query.toString());		
		return cantidadProductos;
	}

	@Override
	public boolean esNombreProductoRepetido(Producto producto) {
		
		StringBuilder query = new StringBuilder();
		query.append("SELECT COUNT(*) FROM producto ");
		query.append(" 	WHERE UPPER(TRIM(nombre)) = ? ");
		
		Object[] parametros = null;	
		if(producto.getId() != null){			
			
			parametros = new Object[2];
			parametros[0] = producto.getNombre().trim().toUpperCase();
			
			query.append("	AND id != ? ");
			parametros[1] = producto.getId();
		}
		else{
			
			parametros = new Object[1];
			parametros[0] = producto.getNombre().trim().toUpperCase();
		}
		
		int count = jdbcTemplate.queryForInt(query.toString(), parametros);
		if(count > 0){
			return true;
		}		
		return false;
	}

}

